iT邦幫忙

2023 iThome 鐵人賽

DAY 20
0
自我挑戰組

C# 和 SQL 探索之路 - 2系列 第 20

Day 20: SQL 的 ROW_NUMBER() 函數

  • 分享至 

  • xImage
  •  

嗨嗨~今天介紹 SQL 中的 ROW_NUMBER() 函數,除了可產生遞增整數以外,也常搭配用來為資料分組。

ROW_NUMBER(): 為每筆資料產生 1 ~ N 的遞增整數。
搭配 OVER 函數,可根據特定的資料欄位排序與產生整數。
例如以下的語法,會根據 Score 欄位產生整數 (名次)。

SELECT ID, Score, Class, ROW_NUMBER() OVER(ORDER BY Score DESC) N'RowNumber'
FROM Students

可搭配 OVER PARTITION BY 關鍵字,根據資料欄位的分組結果產生分組的整數。
例如以下語法,是每個班級依分數高低產生整數 (名次)。

SELECT ID, Score, Class, ROW_NUMBER() OVER(PARTITION BY Class ORDER BY Score DESC) N'RowNumber'
FROM Students

範例:

-- 建立表格 (班級、學號、分數)
CREATE TABLE Students (Class VARCHAR(10), ID INT, Score INT);  

INSERT INTO Students VALUES ('A', 1, 100);  -- A 班
INSERT INTO Students VALUES ('A', 2, 80);  
INSERT INTO Students VALUES ('A', 3, 90);  
INSERT INTO Students VALUES ('B', 4, 70);  -- B 班
INSERT INTO Students VALUES ('B', 5, 75);
INSERT INTO Students VALUES ('C', 6, 85);  -- C 班
INSERT INTO Students VALUES ('C', 7, 91);

-- 所有班級排名
SELECT Class, ID, Score,
	ROW_NUMBER() OVER(ORDER BY Score DESC) AS N'RowNumber'
FROM Students

-- 各班級排名
SELECT ID, Score, Class,
	ROW_NUMBER() OVER(PARTITION BY Class ORDER BY Score DESC) N'RowNumber'
FROM Students

也有與 ROW_NUMBER() 類似的次序函數可以使用,如 RANK() (資料值相同時賦予相同整數,會跳號)、DENSE_RANK() (資料值相同時賦予相同整數,不跳號)

參考資料

  1. SQL QnA: 次序函數
  2. 德瑞克:SQL Server 學習筆記: SQL Server:認識「次序函數(Window Ranking Functions)」(2)

上一篇
Day 19: SQL 計算與上一筆的差值
下一篇
Day 21: SQL 使用 CTE
系列文
C# 和 SQL 探索之路 - 230
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言